package com.atguigu.gmall.cart.service;

import com.atguigu.gmall.model.cart.CartInfo;
import com.atguigu.gmall.model.order.OrderDetail;
import com.atguigu.gmall.model.product.SkuInfo;
import org.springframework.data.redis.core.BoundHashOperations;

import java.util.List;

public interface CartService {

    /**
     * 根据请求头带来的userid 和 临时id，决定操作哪个购物车
     * @param userId
     * @param tempId
     * @return
     */
    String determinCartKey(Long userId, String tempId);

    /**
     * 把一个商品添加到购物车
     * @param cartKey  购物车key
     * @param skuId    商品id
     * @param skuNum   商品数量
     * @return
     */
    SkuInfo addToCart(String cartKey, Long skuId, Integer skuNum);

    /**
     * 获取购物车
     * @param cartKey
     * @return
     */
    BoundHashOperations<String, String, String> getCart(String cartKey);

    /**
     * 给购物车中保存一个商品
     * @param cartKey
     * @param cartInfo
     */
    void saveCartInfo(String cartKey, CartInfo cartInfo);


    /**
     * 从购物车中获取一个商品
     * @param cartKey
     * @param skuId
     * @return
     */
    CartInfo getCartInfo(String cartKey,Long skuId);


    /**
     * 获取购物车列表的所有数据
     * @param userId
     * @param tempId
     * @return
     */
    List<CartInfo> getCartList(Long userId, String tempId);


    /**
     * 获取指定购物车中的所有数据
     * @param cartKey
     * @return
     */
    List<CartInfo>   getCartList(String cartKey);

    /**
     * 清空指定的购物车
     * @param cartKey
     */
    void clearCart(String cartKey);

    /**
     * 删除指定购物车的指定商品
     * @param cartKey
     * @param skuId
     */
    void deleteCartItem(String cartKey, Long skuId);

    /**
     * 修改购物车中指定商品的选中状态
     * @param cartKey  购物车
     * @param skuId    商品id
     * @param checked  选中状态
     */
    void checkedItem(String cartKey, Long skuId, Integer checked);

    /**
     * 给临时购物车要设置过期时间
     * @param cartKey
//     * @param bo
     */
//    boolean expireCart(String cartKey, UserIdBo bo);


    /**
     * 判断是否第一次操作临时购物车
     * @param cartKey
     * @param userId
     * @param userTempId
     * @return
     */
    boolean cartIsTempAndNon(String cartKey, Long userId, String userTempId);


    /**
     * 判断购物车是否数量超限制
     * @param cartKey
     * @param skuId
     */
    void checkCartOverflow(String cartKey, Long skuId);


    /**
     * 异步更新商品的价格
     * @param infos
     * @param cartKey
     */
    void asyncUpdateCartSkuPrice(List<CartInfo> infos, String cartKey);

    /**
     * 获取购物车中所有选中的商品
     * @param cartKey
     * @return  List<OrderDetail> 购物车中所有选中的商品就是未来订单中的每一项明细数据，就是order_detail
     */
    List<OrderDetail>  getLoginCartCheckedItem(String cartKey);

    /**
     * 清除购物车中指定商品
     * @param cartKey
     * @param skuIds
     */
    void clearCartItems(String cartKey, List<Long> skuIds);
}
